37 research outputs found
The Love/Hate Relationship with the C Preprocessor: An Interview Study
The C preprocessor has received strong criticism in academia, among others regarding separation of concerns, error proneness, and code obfuscation, but is widely used in practice. Many (mostly academic) alternatives to the preprocessor exist, but have not been adopted in practice. Since developers continue to use the preprocessor despite all criticism and research, we ask how practitioners perceive the C preprocessor. We performed interviews with 40 developers, used grounded theory to analyze the data, and cross-validated the results with data from a survey among 202 developers, repository mining, and results from previous studies. In particular, we investigated four research questions related to why the preprocessor is still widely used in practice, common problems, alternatives, and the impact of undisciplined annotations. Our study shows that developers are aware of the criticism the C preprocessor receives, but use it nonetheless, mainly for portability and variability. Many developers indicate that they regularly face preprocessor-related problems and preprocessor-related bugs. The majority of our interviewees do not see any current C-native technologies that can entirely replace the C preprocessor. However, developers tend to mitigate problems with guidelines, even though those guidelines are not enforced consistently. We report the key insights gained from our study and discuss implications for practitioners and researchers on how to better use the C preprocessor to minimize its negative impact
Refactoring Alloy Specifications
This paper proposes modeling laws for Alloy, a formal object-oriented modeling language. These laws are important not only to define the axiomatic semantics of Alloy but also to guide and formalize popular software development practices. In particular, these laws can be used to formaly refactor specifications. As an example, we formally refactor a specification for Java types
Identifying Overly Strong Conditions in Refactoring Implementations
Abstract-Each refactoring implementation must check a number of conditions to guarantee behavior preservation. However, specifying and checking them are difficult. Sometimes refactoring tool developers may define overly strong conditions that prevent useful behavior-preserving transformations to be performed. We propose an approach for identifying overly strong conditions in refactoring implementations. We automatically generate a number of programs as test inputs for refactoring implementations. Then, we apply the same refactoring to each test input using two different implementations, and compare both results. We use Safe Refactor to evaluate whether a transformation preserves behavior. We evaluated our approach in 10 kinds of refactorings for Java implemented by three tools: Eclipse and Netbeans, and the JastAdd Refactoring Tool (JRRT). In a sample of 42,774 transformations, we identified 17 and 7 kinds of overly strong conditions in Eclipse and JRRT, respectively
A Comparative Study of Randomized Constraint Solvers for Random-Symbolic Testing
The complexity of constraints is a major obstacle for constraint-based software verification. Automatic constraint solvers are fundamentally incomplete: input constraints often build on some undecidable theory or some theory the solver does not support. This paper proposes and evaluates several randomized solvers to address this issue. We compare the effectiveness of a symbolic solver (CVC3), a random solver, three hybrid solvers (i.e., mix of random and symbolic), and two heuristic search solvers. We evaluate the solvers on two benchmarks: one consisting of manually generated constraints and another generated with a concolic execution of 8 subjects. In addition to fully decidable constraints, the benchmarks include constraints with non-linear integer arithmetic, integer modulo and division, bitwise arithmetic, and floating-point arithmetic. As expected symbolic solving (in particular, CVC3) subsumes the other solvers for the concolic execution of subjects that only generate decidable constraints. For the remaining subjects the solvers are complementary
Object-oriented Programming Laws for Annotated Java Programs
Object-oriented programming laws have been proposed in the context of
languages that are not combined with a behavioral interface specification
language (BISL). The strong dependence between source-code and interface
specifications may cause a number of difficulties when transforming programs.
In this paper we introduce a set of programming laws for object-oriented
languages like Java combined with the Java Modeling Language (JML). The set of
laws deals with object-oriented features taking into account their
specifications. Some laws deal only with features of the specification
language. These laws constitute a set of small transformations for the
development of more elaborate ones like refactorings
The Love/Hate Relationship with the C Preprocessor: An Interview Study (Artifact)
This appendix presents detailed information about the research methods we used in the study, subject characterization, grounded theory process that we followed strictly, and the survey we performed in the study. It provides helpful data for understanding the subtler points of the companion paper and for reproducibility
Design, Verification
Semantics-preserving model transformations are usually proposed in an ad hoc way because it is difficult to prove that they are sound with respect to a formal semantics. So, simple mistakes lead to incorrect transformations that might, for example, introduce inconsistencies to a model. In order to avoid that, we propose a set of simple modeling laws (which can be seen as bi-directional transformations) that can be used to safely derive more complex semanticspreserving transformations, such as refactorings which are useful, for example, to introduce design patterns into a model. Our laws are specific for Alloy, a formal object-oriented modeling language, but they can be leveraged to other object modeling notations. We illustrate their applicability by formally refactoring Alloy models with subtypes in order to improve the analysis performed by the Alloy Analyzer tool
A Refinement Theory for Alloy
Refatoramentos são geralmente propostos de maneira ad hoc, porque é difíıcil provar
formalmente que eles preservam comportamento. Na prática, desenvolvedores, mesmo
utilizando ferramentas de refatoramento, têm que usar compilação e testes para garantir
que os refatoramentos são corretos. Esse cenário não é desejado principalmente no
desenvolvimento de sistemas críticos.
No caso de refatoramento de modelos de objetos, boa parte das transformações se
baseia em argumentações informais. Um outro problema é que as noções de equivalência
para modelos de objetos são muito concretas, no sentido que elas assumem que os modelos
devem possuir operações, ou os mesmos nomes e estruturas. Isso não é adequado em
várias situações: durante refatoramento de modelos, quando usamos elementos do modelo
que são auxiliares, ou quando os modelos comparados possuem elementos distintos,
mas que são relacionados.
Neste trabalho, nosso objetivo é propor um conjunto de transformações que preservam
semântica para Alloy, que é uma linguagem formal de modelagem orientada a objetos.
Nós especificamos em PVS um conjunto de regras de boa formação e estendemos
a semântica para Alloy, e mostramos que as transformações propostas são corretas no
provador de teoremas de PVS. Mostramos também que este conjunto de transformações
´e relativamente completo no sentido que, com ele, podemos derivar um conjunto representativo
de transformações.
Além disso, propomos uma noção de refinamentos mais abstrata e flexível para modelos
de objetos, na qual nosso conjunto de transformações se baseia. Esta noção foi
especificada em PVS, onde provamos algumas propriedades da mesma. Além de provarmos
que ela é composicional, relacionamos a mesma com a noção de refinamento de dados
para Z. Estas transformações são úteis não só para derivarmos refatoramentos formalmente,
como também para otimizações. Além disso, mostramos que as transformações
podem ser utilizadas para derivar refatoramentos que introduzem formalmente padrões
de projeto em Allo